//============================================================================
// Name        : iQ.cpp
// Author      : 
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <sstream>
#include <fstream>
#include <iostream>
#include <cstring>
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "Almacenamiento/Registro.h"
#include "Almacenamiento/Bucket.h"
#include "Almacenamiento/Util.h"
#include "Almacenamiento/Hash.h"
using namespace std;

void TST_REG(){
	Registro *myReg = new Registro("Damian");

	par_libro myPar1 = { 64, 65 };
	par_libro myPar2 = { 66, 67 };
	par_libro myPar3 = { 68, 69 };
	par_libro myPar4 = { 70, 71 };
	par_libro myPar5 = { 72, 73 };

	vector<par_libro> *referencias = new vector<par_libro>();
	referencias->push_back(myPar1);
	referencias->push_back(myPar2);
	referencias->push_back(myPar3);
	referencias->push_back(myPar4);
	referencias->push_back(myPar5);

	myReg->setValues(*referencias);
	delete referencias;

	int cantRef = myReg->getValues().size();
	int lengthKey = myReg->getKey().length();

	cout << "LnK: " << lengthKey << endl;
	cout << "KEY: " << myReg->getKey() << endl;
	cout << "NrR: " << cantRef << endl;
	cout << "REF: ";

	for (int i = 0; i < (cantRef - 1); i++) {
		cout << myReg->getValues()[i].ID_libro << ", ";
		cout << myReg->getValues()[i].cant_repeticiones << " // ";
	}

	cout << myReg->getValues()[cantRef - 1].ID_libro << ", " << myReg->getValues()[cantRef - 1].cant_repeticiones << endl;


	delete myReg;
}

void TST_BCKT(){

	int forDebug = 64;

	Bucket *myBucket = new Bucket(18);
	Registro *myReg;

	cout << forDebug << endl;
	myReg = new Registro(forDebug, "Damian");
	myBucket->insertar(myReg);
	delete myReg;

	forDebug = forDebug + 10;
	myReg = new Registro(forDebug, "Cristian");
	myBucket->insertar(myReg);
	delete myReg;

	forDebug = forDebug + 10;
	myReg = new Registro(forDebug, "Hernan");
	myBucket->insertar(myReg);
	delete myReg;

	cout << forDebug << endl;
	myBucket->persistir("felipe.dat", 0);

	Registro *otherReg = new Registro("Damian");
	if (myBucket->buscar(otherReg) == Bucket::RES_OK) {
	int cantRef = otherReg->getValues().size();
	int lengthKey = otherReg->getKey().length();
	cout << "LgthKey: " << lengthKey << endl;
	cout << "Val.Key: " << otherReg->getKey() << endl;
	cout << "Nro.Ref: " << cantRef << endl;
	cout << "Val.Ref: ";

	for (int i = 0; i < (cantRef - 1); i++) {
		cout << otherReg->getValues()[i].ID_libro << ", ";
		cout << otherReg->getValues()[i].cant_repeticiones << " // ";
	}
	cout << otherReg->getValues()[cantRef - 1].ID_libro << ", " << otherReg->getValues()[cantRef - 1].cant_repeticiones << endl;
	}

	cout << endl << "TODO PIOLA GATO" << endl << endl;

//	cout << endl << myBucket->serializar() << endl;

	delete otherReg;
	delete myBucket;

}

void TST_HSH(){
	Hash *myHash;
//	Registro *myReg;
//
//	int forDebug = 64;


//	myHash->guardarDesdeArchivo("/home/damnvb/Descargas/comprimido2");

	//	int nroLineas = 0;
//	while( getline( file, str ) ){
//		nroLineas++;
//	}
//
//	file.seekg(0, ios_base::beg);




//		ifstream file( "/home/damnvb/Descargas/comprimido2" );
//		string str;
//		string key;
//		par_libro myPar;
//		vector<par_libro> referencias;
//
//
//		int actLinea  = 0;
//
//
//		while( getline( file, str ) ){
//			myHash = new Hash("archBloques", "archBloquesLibres", "archTabla");
//			actLinea++;
//			cout << "Procesando Linea: "<< actLinea <<  endl;
//			if (actLinea == 104)
////				cout << "It's Debugging Time." << endl;
//				break;
//			int finKey = str.find(":",0);
//			key = str.substr(0,finKey);
//			referencias.erase(referencias.begin(),referencias.end());
//
//			unsigned int comaPos = str.find(",",0);
//			int pycPos = str.find(";",0);
//
//			while(pycPos!=-1){
//				string ID_str  = str.substr(finKey+1,comaPos-finKey-1);
//				string rep_str = str.substr(comaPos+1,pycPos-comaPos-1);
//				myPar.ID_libro = (unsigned int)atoi(ID_str.c_str());
//				myPar.cant_repeticiones = (unsigned int)atoi(rep_str.c_str());
//				referencias.push_back(myPar);
//				comaPos = str.find(",",pycPos);
//				pycPos = str.find(";",comaPos);
//			}
//			myPar.ID_libro = (unsigned int)atoi(str.substr(finKey+1,comaPos-finKey-1).c_str());
//			myPar.cant_repeticiones = (unsigned int)atoi(str.substr(comaPos+1,str.size()).c_str());
//			referencias.push_back(myPar);
//			Registro* myReg = new Registro(referencias,key);
//			myHash->guardar(myReg);
//			delete myReg;
//			delete myHash;
//		}

		Registro *unReg = new Registro("abalanzado");
		myHash->buscar(unReg);
		cout << endl << unReg->getKey() << ":";
		for(unsigned int j = 0; j < unReg->getValues().size(); j++) {
			cout << unReg->getValues()[j].ID_libro << "," <<  unReg->getValues()[j].cant_repeticiones << endl;
		}

		delete unReg;
		delete myHash;

//	myReg = new Registro(forDebug, "Damian");
//	myHash->guardar(myReg);
//	//	cout << "INSERTADO: " << myReg->getKey() << endl;
//	delete myReg;
//
//	//	forDebug = forDebug + 10;
//	myReg = new Registro(forDebug, "Cristian");
//	myHash->guardar(myReg);
//	//	cout << "INSERTADO: " << myReg->getKey() << endl;
//	delete myReg;
//
//	//	forDebug = forDebug + 10;
//	myReg = new Registro(forDebug, "Liliana");
//	myHash->guardar(myReg);
//	//	cout << "INSERTADO: " << myReg->getKey() << endl;
//	delete myReg;
//
//	//	forDebug = forDebug + 10;
//	myReg = new Registro(forDebug, "Hernan");
//	myHash->guardar(myReg);
//	//	cout << "INSERTADO: " << myReg->getKey() << endl;
//	delete myReg;
//
//	//	forDebug = forDebug + 10;
//	myReg = new Registro(forDebug, "Gustavo");
//	myHash->guardar(myReg);
//	//	cout << "INSERTADO: " << myReg->getKey() << endl;
//	delete myReg;
//
//	//	forDebug = forDebug + 10;
//	myReg = new Registro(forDebug, "Vero");
//	myHash->guardar(myReg);
//	//	cout << "INSERTADO: " << myReg->getKey() << endl;
//	delete myReg;
//
//	//	forDebug = forDebug + 10;
//	myReg = new Registro(forDebug, "Fefe");
//	myHash->guardar(myReg);
//	//	cout << "INSERTADO: " << myReg->getKey() << endl;
//	delete myReg;

//	myReg = new Registro(forDebug, "Damian");
//	myHash->guardar(myReg);
//	//	cout << "INSERTADO: " << myReg->getKey() << endl;
//	delete myReg;
//	myReg = new Registro(forDebug, "Damian");
//	myHash->guardar(myReg);
//	//	cout << "INSERTADO: " << myReg->getKey() << endl;
//	delete myReg;
//	myReg = new Registro(forDebug, "Damian");
//	myHash->guardar(myReg);
//	//	cout << "INSERTADO: " << myReg->getKey() << endl;
//	delete myReg;
//	//	forDebug = forDebug + 10;
//	myReg = new Registro(forDebug, "Gustavo");
//	myHash->guardar(myReg);
//	//	cout << "INSERTADO: " << myReg->getKey() << endl;
//	delete myReg;
//	//	forDebug = forDebug + 10;
//	myReg = new Registro(forDebug, "Liliana");
//	myHash->guardar(myReg);
//	//	cout << "INSERTADO: " << myReg->getKey() << endl;
//	delete myReg;
//	//	forDebug = forDebug + 10;
//	myReg = new Registro(forDebug, "Fefe");
//	myHash->guardar(myReg);
//	//	cout << "INSERTADO: " << myReg->getKey() << endl;
//	delete myReg;

//	char c;
//
//	cin >> c;
//
//	switch (c) {
//		case 'd':
//			myReg = new Registro(forDebug, "Damian");
//			myHash->guardar(myReg);
//		//	cout << "INSERTADO: " << myReg->getKey() << endl;
//			delete myReg;
//			break;
//
//		case 'c':
//			//	forDebug = forDebug + 10;
//				myReg = new Registro(forDebug, "Cristian");
//				myHash->guardar(myReg);
//			//	cout << "INSERTADO: " << myReg->getKey() << endl;
//				delete myReg;
//			break;
//
//		case 'l':
//			//	forDebug = forDebug + 10;
//				myReg = new Registro(forDebug, "Liliana");
//				myHash->guardar(myReg);
//			//	cout << "INSERTADO: " << myReg->getKey() << endl;
//				delete myReg;
//			break;
//
//		case 'h':
//			//	forDebug = forDebug + 10;
//				myReg = new Registro(forDebug, "Hernan");
//				myHash->guardar(myReg);
//			//	cout << "INSERTADO: " << myReg->getKey() << endl;
//				delete myReg;
//			break;
//
//		case 'g':
//			//	forDebug = forDebug + 10;
//				myReg = new Registro(forDebug, "Gustavo");
//				myHash->guardar(myReg);
//			//	cout << "INSERTADO: " << myReg->getKey() << endl;
//				delete myReg;
//			break;
//
//		case 'v':
//			//	forDebug = forDebug + 10;
//				myReg = new Registro(forDebug, "Vero");
//				myHash->guardar(myReg);
//			//	cout << "INSERTADO: " << myReg->getKey() << endl;
//				delete myReg;
//			break;
//
//		case 'f':
//			//	forDebug = forDebug + 10;
//				myReg = new Registro(forDebug, "Fefe");
//				myHash->guardar(myReg);
//			//	cout << "INSERTADO: " << myReg->getKey() << endl;
//				delete myReg;
//			break;
//
//		default:
//			break;
//	}
}


int main() {

#if 0
	TST_REG();
#endif

#if 0
	TST_BCKT();
#endif

#if 1
	TST_HSH();
#endif

	return 0;
}
